/**
 * 
 */
package com.pxingg.model.pubsub;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.pxingg.Global;

/**
 * 消息 发布-订阅模型中的订阅者，负责处理关注的消息
 * 
 * @author pxingg
 * 
 */
public class Subscriber
{
    /**
     * The log of this class
     */
    static Log log = LogFactory.getLog(Subscriber.class);

    /**
     * 该订阅者的名字
     */
    protected String name;

    /**
     * 默认构造函数
     * 
     * @param name
     *            这个订阅者的名字
     */
    public Subscriber(final String name)
    {
        this.name = name;
    }

    /**
     * 获取订阅者的名字
     * 
     * @return 订阅者的名字
     */
    public String getName()
    {
        return name;
    }

    /**
     * 订阅者对监听到的消息处理的函数<br>
     * 子类需要继承这个消息，并实现对具体消息的处理
     * 
     * @param publishPoint
     *            订阅的消息的名字，这里订阅的消息为com.pxingg.A.B, 发布的消息名字可能为com.pxingg.A.B或com.pxingg.A.B.C
     * @param message
     *            发布的消息内容
     */
    public void process(final String publishPoint, final Message message)
    {
        return;
    }

    /**
     * 订阅一个消息
     * 
     * @param publishPoint
     *            订阅的消息名字，格式为：com.pxingg.A.B.C
     * @return 当前订阅者对象本身
     */
    public Subscriber subscribe(final String publishPoint)
    {
        Global.switchCenter.addSubscriber(publishPoint, this);
        return this;
    }

    /**
     * 取消订阅一个指定消息
     * 
     * @param publishPoint
     *            取消订阅的消息名字，格式为：com.pxingg.A.B.C
     * @return 当前订阅者对象本身
     */
    public Subscriber unsubscribe(final String publishPoint)
    {
        Global.switchCenter.removeSubscriber(publishPoint, this);
        return this;
    }

    /**
     * 取消当前订阅者的所有消息
     */
    public void unsubscribeAll()
    {
        Global.switchCenter.removeSubscriber(this);
    }
}
